package com.java.mbti.service.impl;

import java.util.ArrayList;
import java.util.Map;

import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import com.java.mbti.dao.MbtiDAO;
import com.java.mbti.service.MbtiService;
import com.java.mbti.vo.MbtiPointVO;
import com.java.mbti.vo.MbtiTypeVO;
import com.java.mbti.vo.PaperDTO;
import com.java.member.vo.MemberVO;

@Service
public class MbtiServiceImpl implements MbtiService{
	
	public JavaMailSender mailSender;
	
	@Autowired
	private MbtiDAO dao;

	@Autowired
	@Qualifier("mail")
	public void getMail(JavaMailSender mailSender){
		this.mailSender = mailSender;
	}
	
	@Override
	public ArrayList<PaperDTO> mbtiTest(){
		return dao.mbtiTest();
	}

	MbtiPointVO global_vo = null;
	@Override
	public MbtiPointVO markingMBTI(ArrayList<String> list, MemberVO vo) {
		String  data = null;
		int sumE = 0, sumI = 0, sumS = 0, sumN = 0, sumT = 0, sumF = 0, sumJ = 0, sumP = 0;
		
		for(int i=1; i < list.size(); i++){
			data = (String)list.get(i);
			
			if(i==24){
				String temp = (String)list.get(i);
				if("J".equals(subString(temp,2,3))){
					sumJ += Integer.parseInt(subString(temp,0, 1));
				}else if("I".equals(subString(temp,2,3))){
					sumI += Integer.parseInt(subString(temp,0, 1));
				}
				continue;
			}
			
			if("E".equals(subString(data,2,3))){
				sumE += Integer.parseInt(subString(data,0, 1));
			}else if("I".equals(subString(data,2,3))){
				sumI += Integer.parseInt(subString(data,0, 1));
			}else if("S".equals(subString(data,2,3))){
				sumS += Integer.parseInt(subString(data,0, 1));
			}else if("N".equals(subString(data,2,3))){
				sumN += Integer.parseInt(subString(data,0, 1));
			}else if("T".equals(subString(data,2,3))){
				sumT += Integer.parseInt(subString(data,0, 1));
			}else if("F".equals(subString(data,2,3))){
				sumF += Integer.parseInt(subString(data,0, 1));
			}else if("J".equals(subString(data,2,3))){
				sumJ += Integer.parseInt(subString(data,0, 1));
			}else if("P".equals(subString(data,2,3))){
				sumP += Integer.parseInt(subString(data,0, 1));
			}
		}
		
		System.out.println("총점:" + "E:" + sumE + " " + "I:" + sumI + " " + "S:" 
		+ sumS + " " + "N:" + sumN + " " + "T:" + sumT + " " + "F:" + sumF + " "
				+ "J:" + sumJ + " " + "P:" + sumP);
		
		String type = typeReturn(sumE, sumI, sumS, sumN, sumT, sumF, sumJ, sumP);
		
		System.out.println("=] type : "+ type);
		
		MbtiPointVO innervo = new MbtiPointVO(0,sumE,sumI,sumS,sumN,sumT,sumF,sumJ,sumP,(sumE+sumI),
				(sumS+sumN),(sumT+sumF),(sumJ+sumP),"",type,vo.getMember_id(),vo.getName());
		global_vo = new MbtiPointVO(0,sumE,sumI,sumS,sumN,sumT,sumF,sumJ,sumP,(sumE+sumI),
				(sumS+sumN),(sumT+sumF),(sumJ+sumP),"",type,vo.getMember_id(),vo.getName());
		return innervo;
	}

	public String subString(String type,int a, int b){
		return type.substring(a, b);
	}
	
	public String typeReturn(int e, int i, int s, int n, int t, int f, int j, int p){
		String type = null;
		if( e > i || e == i){
			type = "E";
		}else if(e < i){
			type = "I";
		}
			
		if(s > n){
			type = type + "S";
		}else if(s < n || s == n){
			type = type + "N";
		}
		
		if(t > f){
			type = type + "T";
		}else if(t < f || t == f){
			type = type + "F";
		}
		
		if(j > p){
			type = type + "J";
		}else if(j < p || j == p){
			type = type + "P"; 
		}
		return type;
	}

	@Override
	public MbtiTypeVO searchType(String type) {
		return dao.searchType(type);
	}

	@Override
	public void sendMbtiMail(Map<String, Object> map) throws MessagingException {
		MimeMessage message = mailSender.createMimeMessage();
		
		MimeMessageHelper messageHelper;
		
		String str = ""+map.get("name")+"님 결과 표입니다.";
		str += "<br>";
		str += "영문유형: "+map.get("mbtitype")+" 한글유형: <font size='15'>"+map.get("type_kr")+"</font>입니다.";
		str += "<br>";
		str +="<table border width='785'>";
	//	str +="<tr rowspan='2'><img sr='cid:ENFJ.jpg'><td>";
		str +="<tr><td bgcolor='E6E6FA'>"+map.get("type_title")+"</td></tr>";
		str +="<tr><td>"+map.get("type_description")+"</tr></td>";
		str +="</table>";
		str +="<br>";
		str +="<br>";
		str +="<table border width='785'><tr>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>E</td>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>I</td>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>S</td>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>N</td>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>T</td>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>F</td>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>J</td>";
		str +="<td width='85' align='center' bgcolor='E6E6FA'>P</td>";
		str +="</tr>";
		str +="<tr>";
		str +="<td width='85' align='center' >"+map.get("e")+"</td>";
		str +="<td width='85' align='center' >"+map.get("i")+"</td>";
		str +="<td width='85' align='center' >"+map.get("s")+"</td>";
		str +="<td width='85' align='center' >"+map.get("n")+"</td>";
		str +="<td width='85' align='center' >"+map.get("t")+"</td>";
		str +="<td width='85' align='center' >"+map.get("f")+"</td>";
		str +="<td width='85' align='center' >"+map.get("j")+"</td>";
		str +="<td width='85' align='center' >"+map.get("p")+"</td>";
		str +="</tr></table>";
		str +="<br>";
		str +="<br>";
		str +="<table border width='785'>";
		str +="<tr><td bgcolor='E6E6FA' align='center'>외향성(ExtraveriPointon)</td>" +
				"<td bgcolor='E6E6FA' align='center'>내향성(IntroveriPointon)</td></tr>";
		str +="<tr><td align='center'>자기외부에 주의집중<br>외부활동과 적극적 / 정열적, 활동적 <br> 말로 표현/ 경험한 다음에 이해<br> 쉽게 알려짐</td>" +
				"<td align='center'>자기내부에 주의집중<br>내부활동과 집중력<br>조용하고 신중 / 글로 표현<br>이해한 다음에 경험 / 서서히 알려짐</td></tr>";
		str +="<tr><td bgcolor='E6E6FA' align='center'>감각형(ePointniPointng)</td><td bgcolor='E6E6FA' align='center'>직관형(iNtuition)</td></tr>";
		str +="<tr><td align='center'>지금, 현재에 촛점<br>실제의 경험 / 정확, 철저한 일처리<br>나무를 보려는 경향 / 가꾸고 추수함</td>" +
				"<td align='center'>미래 가능성에 촛점<br>아이디어 / 신속비약적인 일처리<br>숲을 보려는 경향 / 씨뿌림</td></tr>";
		str +="<tr><td bgcolor='E6E6FA' align='center'>사고형(Thinking)</td><td bgcolor='E6E6FA' align='center'>감정형(Feeling)</td></tr>";
		str +="<tr><td align='center'>진실, 사실에 주관점<br>원리와 원칙 / 논리적, 분석적<br>맞다, 틀리다 / 규범, 기준중시<br>지적 논평</td>" +
				"<td align='center'>사람, 관계에 주관점<br>의미와 영향 / 상황적, 포괄적<br>좋다, 나쁘다 / 나에게 주는<br>의미 중시 / 우호적 협조</td></tr>";
		str +="<tr><td bgcolor='E6E6FA' align='center'>감정형(Feeling)</td><td bgcolor='E6E6FA' align='center'>인식형(Perceiving)</td></tr>";
		str +="<tr><td align='center'>사람, 관계에 주관점<br>의미와 영향 / 상황적, 포괄적<br>좋다, 나쁘다 / 나에게 주는<br>의미 중시 / 우호적 협조</td>" +
				"<td align='center'>상황에 맞추는 개방성<br>이해로 수용 / 유우자적한 과정<br>융통과 적용<br>목적과 방향은 변화할 수 있다는 개방성<br>재량에 따라 처리될 수 있는 포용성</td></tr>";
		str +="</table>";
		
		messageHelper = new MimeMessageHelper(message, true, "UTF-8");
		messageHelper.setSubject("MBTI 결과 내용입니다."); //수신자
		messageHelper.setTo(map.get("email")+"@"+map.get("email_type")); // 받는 사람
		messageHelper.setCc("bum_young@nate.co.kr"); //참조?
		messageHelper.setBcc("bum_young@nate.co.kr"); //숨은 참조
		messageHelper.setFrom("bum_young@nate.co.kr"); //발신자
		messageHelper.setText(str, true);// 메일 내용 true html 유무
//		String path = MbtiServiceImpl.class.getResource("").getPath();
//		String path2 = path.substring(0, 57);
//		
//		DataSource dataSource = new FileDataSource("/"+path2+"mbti/img/ENFJ.jpg");
//		
//		messageHelper.addAttachment("ENFJ.jpg", dataSource);
//		
//		http://biyam.tistory.com/29 //참고사이트
		
//		messageHelper.addInline("img.jpg", new FileDataSource("/"+path2+"mbti/img/ENFJ.jpg"));
		mailSender.send(message);
		
	}

	@Override
	public MbtiPointVO resultSearchOne() {
		return global_vo;
	}

}
